home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / misc / amag / sh9302a.lha / Quevedo (S.45) / QuevedoRoutinen.mod < prev    next >
Text File  |  1993-08-05  |  6KB  |  201 lines

  1. (* QuevedoRoutinen.mod Version 2.0 / 5-8-93, Kern von Quevedo *)
  2.  
  3. MODULE QuevedoRoutinen;
  4.  
  5. TYPE stellung* = RECORD
  6.                    wtx*,wty*,wkx*,wky*,skx*,sky* : INTEGER;
  7.                    schach*,matt*,turmzug* : BOOLEAN;
  8.                    bewertung : LONGINT
  9.                  END;
  10.  
  11. PROCEDURE Mini(a,b : INTEGER) : INTEGER;
  12. BEGIN
  13.   IF (a < b) THEN
  14.     RETURN a
  15.   ELSE
  16.     RETURN b
  17.   END
  18. END Mini;
  19.  
  20. PROCEDURE Maxi(a,b : INTEGER) : INTEGER;
  21. BEGIN
  22.   IF (a > b) THEN
  23.     RETURN a
  24.   ELSE
  25.     RETURN b
  26.   END
  27. END Maxi;
  28.  
  29. PROCEDURE Zahl(ausdruck : BOOLEAN) : INTEGER;
  30. (* FALSE -> 0, TRUE -> 1 *)
  31. BEGIN
  32.   IF (ausdruck) THEN
  33.     RETURN 1
  34.   ELSE
  35.     RETURN 0
  36.   END
  37. END Zahl;
  38.  
  39. PROCEDURE Bedroht(s : stellung; x,y : INTEGER) : BOOLEAN;
  40. (* Bedroht der weiße Turm oder König in Stellung s das Feld (x,y) ? *)
  41. BEGIN
  42.   RETURN (Maxi(ABS(s.wkx - x),ABS(s.wky - y)) = 1) OR
  43.          (s.wtx = x) & ((s.wkx # x) OR ((s.wky < s.wty) = (s.wky < y))) OR
  44.          (s.wty = y) & ((s.wky # y) OR ((s.wkx < s.wtx) = (s.wkx < x)))
  45. END Bedroht;
  46.  
  47. PROCEDURE LegaleStellung*(s : stellung) : BOOLEAN;
  48. (* Ist die Stellung s legal, wenn weiß am Zug ist ? *)
  49. BEGIN
  50.   RETURN (s.wtx >= 1) & (s.wtx <= 8) & (s.wty >= 1) & (s.wty <= 8) &
  51.          (s.wkx >= 1) & (s.wkx <= 8) & (s.wky >= 1) & (s.wky <= 8) &
  52.          (s.skx >= 1) & (s.skx <= 8) & (s.sky >= 1) & (s.sky <= 8) &
  53.          ((s.wtx # s.wkx) OR (s.wty # s.wky)) &
  54.          ((s.wkx # s.skx) OR (s.wky # s.sky)) &
  55.          ((s.skx # s.wtx) OR (s.sky # s.wty)) &
  56.          ~Bedroht(s,s.skx,s.sky)
  57. END LegaleStellung;
  58.  
  59. PROCEDURE BewerteStellung(VAR s : stellung);
  60. (* Stellung s bewerten und ggf. die Variablen schach und matt setzen *)
  61. VAR zeilen,spalten,reihen,deltawksk,deltawksk2,deltawtwk,deltawtsk,
  62.     distanzx,distanzy,distanz,turmgefahr1,turmgefahr2,x,y : INTEGER;
  63.     baldmatt,fastmatt,patt,turmbedroht : BOOLEAN;
  64. BEGIN
  65.   s.schach := Bedroht(s,s.skx,s.sky);
  66.   s.matt := FALSE;
  67.   patt := TRUE;
  68.   FOR x := Maxi(s.skx - 1,1) TO Mini(s.skx + 1,8) DO
  69.     FOR y := Maxi(s.sky - 1,1) TO Mini(s.sky + 1,8) DO
  70.       patt := patt & (Bedroht(s,x,y) OR (x = s.skx) & (y = s.sky))
  71.     END
  72.   END;
  73.   IF patt & s.schach THEN
  74.     patt := FALSE;
  75.     s.matt := TRUE
  76.   END;
  77.   deltawtwk := Maxi(ABS(s.wkx - s.wtx),ABS(s.wky - s.wty));
  78.   deltawtsk := Maxi(ABS(s.skx - s.wtx),ABS(s.sky - s.wty));
  79.   deltawksk := Maxi(ABS(s.skx - s.wkx),ABS(s.sky - s.wky));
  80.   deltawksk2:= ABS(s.skx - s.wkx) + ABS(s.sky - s.wky);
  81.   turmgefahr1 := deltawtwk - deltawtsk + 8;
  82.   turmgefahr2 := 8 - deltawtsk;
  83.   turmbedroht := (deltawtsk = 1) & (deltawtwk > 1);
  84.   IF (s.wtx < s.skx) & (s.wtx < s.wkx) THEN
  85.     spalten := 8 - s.wtx
  86.   ELSIF (s.wtx > s.skx) & (s.wtx > s.wkx) THEN
  87.     spalten := s.wtx - 1
  88.   ELSE
  89.     spalten := 9
  90.   END;
  91.   IF (s.wty < s.sky) & (s.wty < s.wky) THEN
  92.     zeilen := 8 - s.wty
  93.   ELSIF (s.wty > s.sky) & (s.wty > s.wky) THEN
  94.     zeilen := s.wty - 1
  95.   ELSE
  96.     zeilen := 9
  97.   END;
  98.   distanzx := ABS(s.wkx - s.skx +
  99.                   (s.wtx - s.skx) * Zahl(ABS(s.wtx - s.skx) <= 1));
  100.   distanzy := ABS(s.wky - s.sky +
  101.                   (s.wty - s.sky) * Zahl(ABS(s.wty - s.sky) <= 1));
  102.   IF (spalten < zeilen) OR (spalten = zeilen) & (distanzx < distanzy) THEN
  103.     reihen := spalten;
  104.     distanz := distanzx
  105.   ELSE
  106.     reihen := zeilen;
  107.     distanz := distanzy
  108.   END;
  109.   baldmatt := (Mini(s.skx,9 - s.skx) = 1) & (Mini(s.sky,9 - s.sky) = 1) &
  110.               (deltawksk = 2) & (deltawksk2 = 3);
  111.   fastmatt := (deltawksk = 2) &
  112.               ((Mini(s.skx,9 - s.skx) = 1) &
  113.                ((Mini(s.sky,9 - s.sky) = 2) & (zeilen = 2) OR
  114.                 (ABS(s.wty - s.sky) = 1) & (ABS(s.wty - s.wky) = 2)) OR
  115.                (Mini(s.sky,9 - s.sky) = 1) &
  116.                ((Mini(s.skx,9 - s.skx) = 2) & (spalten = 2) OR
  117.                 (ABS(s.wtx - s.skx) = 1) & (ABS(s.wtx - s.wkx) = 2)));
  118.   s.bewertung := 0;
  119.   s.bewertung := s.bewertung * 2 + Zahl(patt);
  120.   s.bewertung := s.bewertung * 2 + Zahl(turmbedroht);
  121.   s.bewertung := s.bewertung * 2 + Zahl(~s.matt);
  122.   s.bewertung := s.bewertung * 2 + Zahl(~fastmatt);
  123.   s.bewertung := s.bewertung * 2 + Zahl(~baldmatt);
  124.   s.bewertung := s.bewertung * 8 + reihen;
  125.   s.bewertung := s.bewertung * 8 + distanz;
  126.   s.bewertung := s.bewertung * 8 + deltawksk;
  127.   s.bewertung := s.bewertung * 8 + deltawksk2;
  128.   s.bewertung := s.bewertung * 8 + turmgefahr1;
  129.   s.bewertung := s.bewertung * 8 + turmgefahr2
  130. END BewerteStellung;
  131.  
  132. PROCEDURE WeisserZug*(VAR s : stellung);
  133. (* Alle für Weiß möglichen Züge ausprobieren, den besten ausführen *)
  134. VAR i,x,y,xmin,xmax,ymin,ymax,anzahl,optimum : INTEGER;
  135.     minimum : LONGINT;
  136.     pos : ARRAY 25 OF stellung;
  137. BEGIN
  138.   anzahl := 0;
  139.   xmin := 1;
  140.   xmax := 8;
  141.   ymin := 1;
  142.   ymax := 8;
  143.   IF s.wtx = s.wkx THEN
  144.     IF s.wty < s.wky THEN
  145.       ymax := s.wky - 1
  146.     ELSE
  147.       ymin := s.wky + 1
  148.     END
  149.   ELSIF s.wty = s.wky THEN
  150.     IF s.wtx < s.wkx THEN
  151.       xmax := s.wkx - 1
  152.     ELSE
  153.       xmin := s.wkx + 1
  154.     END
  155.   END;
  156.   FOR x := xmin TO xmax DO
  157.     IF (x # s.wtx) THEN
  158.       pos[anzahl] := s;
  159.       pos[anzahl].wtx := x;
  160.       pos[anzahl].turmzug := TRUE;
  161.       BewerteStellung(pos[anzahl]);
  162.       INC(anzahl)
  163.     END
  164.   END;
  165.   FOR y := ymin TO ymax DO
  166.     IF (y # s.wty) THEN
  167.       pos[anzahl] := s;
  168.       pos[anzahl].wty := y;
  169.       pos[anzahl].turmzug := TRUE;
  170.       BewerteStellung(pos[anzahl]);
  171.       INC(anzahl)
  172.     END
  173.   END;
  174.   FOR x := Maxi(s.wkx - 1,1) TO Mini(s.wkx + 1,8) DO
  175.     FOR y := Maxi(s.wky - 1,1) TO Mini(s.wky + 1,8) DO
  176.       IF ((x # s.wkx) OR (y # s.wky)) &
  177.          ((x # s.wtx) OR (y # s.wty)) &
  178.          (Maxi(ABS(x - s.skx),ABS(y - s.sky)) > 1) THEN
  179.         pos[anzahl] := s;
  180.         pos[anzahl].wkx := x;
  181.         pos[anzahl].wky := y;
  182.         pos[anzahl].turmzug := FALSE;
  183.         BewerteStellung(pos[anzahl]);
  184.         INC(anzahl)
  185.       END
  186.     END
  187.   END;
  188.   optimum := 0;
  189.   minimum := pos[0].bewertung;
  190.   FOR i := 1 TO anzahl - 1 DO
  191.     IF (pos[i].bewertung < minimum) THEN
  192.       optimum := i;
  193.       minimum := pos[i].bewertung
  194.     END
  195.   END;
  196.   s := pos[optimum]
  197. END WeisserZug;
  198.  
  199. END QuevedoRoutinen.
  200.  
  201.